package com.zxy.ziems.server.device.controller;

import com.zxy.ziems.server.device.pojo.dto.DevicePropertyDTO;
import com.zxy.ziems.server.device.pojo.vo.DevicePropertyVO;
import com.zxy.ziems.server.device.service.DevicePropertyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 采集管理-管理属性配置
 *
 * @author 10348359
 * @create 2024-03-26 14:57
 */
@RestController
@Validated
@RequestMapping("/api")
public class DevicePropertyController {
    /**
     * 新增属性定义
     *
     * @param dto 用户post参数
     * @return
     */
    @PostMapping("/device/collector/device/property/add")
    public void add(
            @Validated(value = DevicePropertyDTO.Add.class)
            @RequestBody DevicePropertyDTO<Object> dto) throws Exception {
        service.add(dto);
    }

    /**
     * 新增属性定义(不包含数据单位)
     *
     * @param dto 用户post参数
     * @return
     */
    @PostMapping("/device/collector/device/property/save")
    public void save(
            @Validated(value = DevicePropertyDTO.Add.class)
            @RequestBody DevicePropertyDTO<Object> dto) throws Exception {
        if (dto.getId() == null) {
            // 新增采集单位默认0
            dto.setDataUnitId("0");
            service.addDataTypeAndUnit(dto);
        } else {
            service.updateDataTypeAndUnit(dto);
        }

    }

    /**
     * 设备-属性绑定
     *
     * @param dto 用户post参数
     * @return
     */
    @PostMapping("/device/property/bind")
    public void bind(@RequestBody DevicePropertyDTO<Object> dto) throws Exception {
        service.bind(dto);
    }

    /**
     * 更新属性定义
     *
     * @param dto 用户post参数
     * @return
     */
    @PostMapping("/device/collector/device/property/update")
    public void update(
            @Validated(value = DevicePropertyDTO.Update.class)
            @RequestBody DevicePropertyDTO<Object> dto) throws Exception {
        service.update(dto);
    }

    /**
     * 删除属性定义(校验是否可删除)
     *
     * @param dto 用户post参数
     * @return
     */
    @PostMapping("/device/collector/device/property/deleteCheckById")
    public boolean deleteCheckById(
            @Validated(value = DevicePropertyDTO.Delete.class)
            @RequestBody DevicePropertyDTO dto) {
        return service.deleteCheckById(dto.getId());
    }

    /**
     * 删除属性定义
     *
     * @param dto 用户post参数
     * @return
     */
    @PostMapping("/device/collector/device/property/delete")
    public void delete(
            @Validated(value = DevicePropertyDTO.Delete.class)
            @RequestBody DevicePropertyDTO dto) throws Exception {
        service.deleteById(dto.getId());
    }

    /**
     * 集采管理-根据设备id查询设备的所有属性列表
     * 初次请求返回的是该设备类型定义的属性列表(没有id， metaStatus为1)
     *
     * @param deviceId 设备id
     * @return
     */
    @GetMapping("/device/collector/device/property/list")
    public List<DevicePropertyVO> list(String deviceId) throws Exception {
        return service.viewListByDeviceId(deviceId);
    }

    private DevicePropertyService service;

    @Autowired
    public void setService(DevicePropertyService devicePropertyService) {
        this.service = devicePropertyService;
    }
}
